package com.stefanini.pe.bbva.bp.in.dao.impl;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
import org.springframework.stereotype.Repository;

import com.ibatis.sqlmap.client.SqlMapClient;
import com.stefanini.pe.bbva.bp.in.dao.iface.RebalanceoDAOIface;
import com.stefanini.pe.bbva.bp.in.to.DetalleRebalanceoTO;
import com.stefanini.pe.bbva.bp.in.to.Rebalanceo;
import com.stefanini.pe.bbva.bp.in.utils.Util;

@Repository(value="rebalanceoDAO")
public class RebalanceoDAOImpl extends SqlMapClientDaoSupport implements RebalanceoDAOIface {
	
	@Autowired
	public RebalanceoDAOImpl(SqlMapClient sqlMapClient) {
		setSqlMapClient(sqlMapClient);
	}
	
	@SuppressWarnings("unchecked")
	public List<Rebalanceo> listarHistoricosRebalanceo(Rebalanceo oRebalanceo) throws Exception{
		HashMap map=new HashMap();
		map.put("in_cliente", oRebalanceo.getCodcliente());
		map.put("in_fechadesde", oRebalanceo.getFecharebalanceo());
		map.put("in_fechahasta", oRebalanceo.getFecharebalanceoFinal());
		map.put("in_nombreejecutivo", oRebalanceo.getNombreEjecutivo()==null?"":oRebalanceo.getNombreEjecutivo().toUpperCase());
		
		System.out.println("sp: IIAF.PIIAF_ASESORIA2.sp_cons_as_rebalanceoclhist, param: "+map);
		getSqlMapClientTemplate().queryForList("BP_REBALANCEO_SqlMap.listarHistoricoRebalanceo",map);
		return (List)map.get("result");
	}
	
	@SuppressWarnings("unchecked")
	public List<HashMap> listarArchivosRebalanceo(Rebalanceo oRebalanceo) {
		HashMap map=new HashMap();
		map.put("in_idrebalanceo", oRebalanceo.getIdrebalanceo());
		getSqlMapClientTemplate().queryForList("BP_REBALANCEO_SqlMap.listarArchivosRebalanceo",map);
		return (List)map.get("result");
	}
	
	@SuppressWarnings("unchecked")
	public List<Rebalanceo> listarHistoricosRebalanceoNC(Rebalanceo oRebalanceo) {
		HashMap map=new HashMap();
		map.put("in_nocliente", oRebalanceo.getCodcliente());
		map.put("in_fechadesde", oRebalanceo.getFecharebalanceo());
		map.put("in_fechahasta", oRebalanceo.getFecharebalanceoFinal());
		map.put("in_nombreejecutivo", oRebalanceo.getNombreEjecutivo()==null?"":oRebalanceo.getNombreEjecutivo().toUpperCase());
		getSqlMapClientTemplate().queryForList("BP_REBALANCEO_SqlMap.listarHistoricoRebalanceoNC",map);
		return (List)map.get("result");
	}
	
	@SuppressWarnings("unchecked")
	public List<HashMap> listarArchivosRebalanceoNC(Rebalanceo oRebalanceo) {
		HashMap map=new HashMap();
		map.put("in_idrebalanceonocliente", oRebalanceo.getIdrebalanceonocliente());
		getSqlMapClientTemplate().queryForList("BP_REBALANCEO_SqlMap.listarArchivosRebalanceoNC",map);
		return (List)map.get("result");
	}
	
	@SuppressWarnings("unchecked")
	public List<HashMap> listarPosicionContrato(String codCliente){
		HashMap map=new HashMap();
		map.put("in_codcliente", codCliente);
		
		System.out.println("sp: IIAF.PIIAF_ASESORIA.sp_cons_as_posicactcontrato, param: "+map);
		getSqlMapClientTemplate().queryForList("BP_REBALANCEO_SqlMap.listarPosicionContrato",map);
		return (List)map.get("result");
	}
	
	@SuppressWarnings("unchecked")
	public List<HashMap> cambiarEstadoRebalanceo(String codCliente,String idRebalanceo,String estado,
			String observaciones) throws Exception{
		HashMap map=new HashMap();
		map.put("in_codcliente", codCliente);
		map.put("in_idrebalanceo", idRebalanceo);
		map.put("in_estado", estado);
		map.put("in_observaciones", observaciones);
		
		System.out.println("sp: IIAF.PIIAF_ASESORIA2.sp_cons_as_frebalanceoclhist, param: "+map);
		getSqlMapClientTemplate().queryForList("BP_REBALANCEO_SqlMap.cambiarEstadoRebalanceo",map);
		return (List)map.get("result");
	}
	
	@SuppressWarnings("unchecked")
	public List<HashMap> cambiarEstadoRebalanceoNC(String codCliente,String idRebalanceo,String estado){
		HashMap map=new HashMap();
		map.put("in_idnocliente", codCliente);
		map.put("in_idrebalanceonocliente", idRebalanceo);
		map.put("in_aceptar", estado);
		getSqlMapClientTemplate().queryForList("BP_REBALANCEO_SqlMap.cambiarEstadoRebalanceoNC",map);
		return (List)map.get("result");
	}
	
	@SuppressWarnings("unchecked")
	public List<HashMap> listarPosicionDetalle(String codCliente){
		HashMap map=new HashMap();
		map.put("in_codcliente", codCliente);
		
		System.out.println("sp: IIAF.PIIAF_ASESORIA.sp_cons_as_posicactdtcontrato, params: "+map);
		getSqlMapClientTemplate().queryForList("BP_REBALANCEO_SqlMap.listarPosicionDetalle",map);
		return (List)map.get("result");
	}
	
	@SuppressWarnings("unchecked")
	public HashMap validarRebalanceo(String codCliente) throws Exception{
		HashMap map=new HashMap();
		map.put("in_codcliente", codCliente);
		
		System.out.println("sp: IIAF.PIIAF_ASESORIA2.sp_cons_as_vrebalanceoclhist, param: "+map);
		getSqlMapClientTemplate().queryForList("BP_REBALANCEO_SqlMap.validarRebalanceo",map);
		return map;
	}
	
	@SuppressWarnings("unchecked")
	public HashMap validarRebalanceoNC(String codCliente){
		HashMap map=new HashMap();
		map.put("in_idnocliente", codCliente);
		getSqlMapClientTemplate().queryForList("BP_REBALANCEO_SqlMap.validarRebalanceoNC",map);
		return map;
	}
	
	@SuppressWarnings("unchecked")
	public List<Rebalanceo> listarRebalanceoAnual(String anio, String codUsuAsesor) {
		HashMap map=new HashMap();
		map.put("in_anio", new BigDecimal(anio==null?"0":anio));
		map.put("in_idsusuarioasesor", codUsuAsesor);
		getSqlMapClientTemplate().queryForList("BP_REBALANCEO_SqlMap.listarRebalanceoAnual",map);
		return (List)map.get("result");
	}
	
	@SuppressWarnings("unchecked")
	public List<Rebalanceo> listarResultadoRebalanceo(String codUsuAsesor) {
		HashMap map=new HashMap();
		map.put("in_idsusuarioasesor", codUsuAsesor);
		getSqlMapClientTemplate().queryForList("BP_REBALANCEO_SqlMap.listarResultadoRebalanceo",map);
		return (List)map.get("result");
	}
	
	/*
	 * PESTANA DE GESTION DE REBALANCEO DE RESULTADOS POR PERIODO
	 * */
	@SuppressWarnings("unchecked")
	public List<Rebalanceo> listarResultadoPorPeriodo(String codUsuAsesor) {
		HashMap map=new HashMap();
		map.put("in_idsusuarioasesor", codUsuAsesor);
		getSqlMapClientTemplate().queryForList("BP_REBALANCEO_SqlMap.listarResultadoPorPeriodo",map);
		return (List)map.get("result");
	}
	
	@SuppressWarnings("unchecked")
	public List<Map<String,Object>> listarDetalleRebalanceo(String idRebalanceo) {
		HashMap<String,Object> map=new HashMap<String,Object>();
		map.put("in_idrebalanceo", idRebalanceo);
		getSqlMapClientTemplate().queryForList("BP_REBALANCEO_SqlMap.listarRebalanceobyId",map);
		return (List<Map<String,Object>>)map.get("result");
	}
	
	@SuppressWarnings("unchecked")
	public List<Map<String,Object>> listarDetalleRebalanceoDistribucion(String idRebalanceo) {
		HashMap<String,Object> map=new HashMap<String,Object>();
		map.put("in_idrebalanceo", idRebalanceo);
		getSqlMapClientTemplate().queryForList("BP_CALCULADORAMOD_SqlMap.detalleDistribucionCatActivo",map);
		return (List<Map<String,Object>>)map.get("result");
	}
	
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public Map<String,ArrayList<DetalleRebalanceoTO>> obtenerDetalle(String idRebalanceo) throws Exception{
		Map map = new HashMap();
		map.put("in_idrebalanceo", idRebalanceo);
		
		System.out.println("sp: IIAF.PIIAF_ASESORIA2.sp_cons_as_detalleHistRebal, param: "+map);
		getSqlMapClientTemplate().queryForList("BP_REBALANCEO_SqlMap.detalleRebalanceo",map);
		return map; 
	}
	
	public void guardarInformacionAdicionalBonos(String nemotecnico,String emisor, String codsector,String codTipoInstrumento,String codMoneda,
			String montoInvertir,String rendimiento,String fechaInicio,String fechaVencimiento,
			String duracion,String codAmortizacion,String codFrecuenciaPago,String riesgoCrediticio,
			String idRebalanceo, String flagPreInsert) throws Exception{
		
		Map<String,Object> map=new LinkedHashMap<String, Object>();
		map.put("in_nemotecnico", nemotecnico);
		map.put("in_emisor", emisor);
		map.put("in_codsector", codsector);
		map.put("in_codtipoinstrumento", codTipoInstrumento);
		map.put("in_codmoneda", codMoneda);
		map.put("in_montoinvertir", montoInvertir);
		map.put("in_rendimiento", rendimiento);
		map.put("in_fechainicio", fechaInicio);
		map.put("in_fechavencimiento", fechaVencimiento);
		map.put("in_duracion", duracion);
		map.put("in_codamortizacion", codAmortizacion);
		map.put("in_codfrecuenciapago", codFrecuenciaPago);
		map.put("in_riesgocrediticio", riesgoCrediticio);
		map.put("in_idrebalanceo", idRebalanceo);
		map.put("in_flagpreinsert", flagPreInsert);
			
		System.out.println("sp: IIAF.PIIAF_ASESORIA2.sp_ins_as_infoAdiBonos, params: "+map);
		getSqlMapClientTemplate().queryForList("BP_REBALANCEO_SqlMap.guardarInformacionAdicionalBonos",map);
	}
	
	public void guardarInformacionAdicionalOperaciones(String codMoneda,String precioContado,String	precioPlazo,String rendimiento,
			   String fechaInicio,String fechaVencimiento,String montoInvertir,String idRebalanceo, 
			   String flagPreInsert) throws Exception{
		Map<String,Object> map = new LinkedHashMap<String, Object>();
		map.put("in_codmoneda", codMoneda);
		map.put("in_preciocontado", precioContado);
		map.put("in_precioplazo", precioPlazo);
		map.put("in_rendimiento", rendimiento);
		map.put("in_fechainicio", fechaInicio);
		map.put("in_fechavencimiento", fechaVencimiento);
		map.put("in_montoinvertir", montoInvertir);
		map.put("in_idrebalanceo", idRebalanceo);
		map.put("in_flagpreinsert", flagPreInsert);
		
		System.out.println("sp: IIAF.PIIAF_ASESORIA2.sp_ins_as_infoAdiOperaciones, params: "+map);
		getSqlMapClientTemplate().queryForList("BP_REBALANCEO_SqlMap.guardarInformacionAdicionalOperaciones",map);
	}
	
	public void guardarInformacionAdicionalAcciones(String nemotecnico,String empresa,String codsector,String codMoneda,String precioObjetivo,
			 String cotizacionAnual,String maximo,String minimo,String participacionPortafolio,
			 String montoInvertir,String idRebalanceo, String flagPreInsert) throws Exception{
		Map<String,Object> map = new LinkedHashMap<String, Object>();
		map.put("in_nemotecnico", nemotecnico);
		map.put("in_empresa", empresa);
		map.put("in_codsector", codsector);
		map.put("in_codmoneda", codMoneda);
		map.put("in_precioobjetivo", precioObjetivo);
		map.put("in_cotizacionanual", cotizacionAnual);
		map.put("in_maximo", maximo);
		map.put("in_minimo", minimo);
		map.put("in_participacionportafolio", participacionPortafolio);
		map.put("in_montoinvertir", montoInvertir);
		map.put("in_idrebalanceo", idRebalanceo);
		map.put("in_flagpreinsert", flagPreInsert);
		
		System.out.println("sp: IIAF.PIIAF_ASESORIA2.sp_ins_as_infoAdiAcciones, params: "+map);
		getSqlMapClientTemplate().queryForList("BP_REBALANCEO_SqlMap.guardarInformacionAdicionalAcciones",map);
	}
	
	public void guardarInformacionAdicionalDepEstructurados(String instrumento,String subyacente,String codMoneda,																
			   	String cap,String timg,String montoInvertir,String idRebalanceo, String flagPreInsert) throws Exception{
		Map<String,Object> map=new LinkedHashMap<String, Object>();
		map.put("in_instrumento", instrumento);
		map.put("in_subyacente", subyacente);
		map.put("in_codmoneda", codMoneda);
		map.put("in_cap", cap);
		map.put("in_timg", timg);
		map.put("in_montoinvertir", montoInvertir);
		map.put("in_idrebalanceo", idRebalanceo);
		map.put("in_flagpreinsert", flagPreInsert);
		
		System.out.println("sp: IIAF.PIIAF_ASESORIA2.sp_ins_as_infoAdiDepEsctruct, param: "+map);
		getSqlMapClientTemplate().queryForList("BP_REBALANCEO_SqlMap.guardarInformacionAdicionalDepEstructurados",map);
	}
	
	public void guardarInformacionAdicionalOpciones(String tipo,String subyacente,String clase,String codMoneda,String primaInversion,
			String montoInversion,String porcentajePrima,String plazo,String idRebalanceo, String flagPreInsert) throws Exception{					
		Map<String,Object> map=new LinkedHashMap<String, Object>();
		map.put("in_tipo", tipo);
		map.put("in_subyacente", subyacente);
		map.put("in_clase", clase);
		map.put("in_codmoneda", codMoneda);
		map.put("in_primainversion", primaInversion);
		map.put("in_montoinversion", montoInversion);
		map.put("in_porcentajeprima", porcentajePrima);
		map.put("in_plazo", plazo);
		map.put("in_idrebalanceo", idRebalanceo);
		map.put("in_flagpreinsert", flagPreInsert);
		
		System.out.println("sp: IIAF.PIIAF_ASESORIA2.sp_ins_as_infoAdiOpciones, param: "+map);
		getSqlMapClientTemplate().queryForList("BP_REBALANCEO_SqlMap.guardarInformacionAdicionalOpciones",map);
	}
	
	public String listarIdsCodContrato(String idrebalanceocontrato) {
		HashMap map=new HashMap();
		map.put("in_idrebalanceo", idrebalanceocontrato);
		
		System.out.println("sp: IIAF.PIIAF_ASESORIA2.sp_cons_as_idscontratos, param: "+map);
		getSqlMapClientTemplate().queryForList("BP_REBALANCEO_SqlMap.listarIdsContrato",map);
		System.out.println("result IIAF.PIIAF_ASESORIA2.sp_cons_as_idscontratos: "+String.valueOf(map.get("out_indscontrato")));
		return (String)map.get("out_indscontrato");
	}
	
	@SuppressWarnings("unchecked")
	public String clonarRebalanceo(String idrebalanceo){
		HashMap map=new HashMap(); 
		map.put("in_idrebalanceo", idrebalanceo);
		
		System.out.println("sp: IIAF.PIIAF_ASESORIA2.sp_ins_as_clonar_rebalanceo, param:"+map);
		getSqlMapClientTemplate().queryForList("BP_REBALANCEO_SqlMap.clonarRebalanceo",map);
		return (String)map.get("out_new_idrebalanceo");
	}

	public List<Map> listarAutocompleteNemotecnicoBono(String inNemoTecnico) throws Exception{
		HashMap map=new HashMap(); 
		map.put("in_nemonico", inNemoTecnico);
		
		System.out.println("sp: IIAF.PIIAF_ASESORIA3.sp_cons_as_infAdi_Bono, param:"+map);
		getSqlMapClientTemplate().queryForList("BP_REBALANCEO_SqlMap.listarAutocompleteNemotecnicoBono",map);
		return (List<Map>) map.get("out_result_set1");
	}
	
	public List<Map> listarAutocompleteNemotecnicoAcciones(String inNemoTecnico) throws Exception{
		HashMap map=new HashMap(); 
		map.put("in_nemonico", inNemoTecnico);
		
		System.out.println("sp: IIAF.PIIAF_ASESORIA3.sp_cons_as_infAdi_Acciones, param:"+map);
		getSqlMapClientTemplate().queryForList("BP_REBALANCEO_SqlMap.listarAutocompleteNemotecnicoAcciones",map);
		return (List<Map>) map.get("out_result_set1");
	}
}
